debug: Add GTK_DEBUG=snapshot
authorBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 18:20:02 +0000 (19:20 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 18:26:40 +0000 (19:26 +0100)
This causes the snapshotting algorithm to dump all widget nodes into
their own container node. We then name that group accordingly (ie
"GtkSwitch<0xdeadbeef>") so you can easily see which node belongs where.

The feature is toggleable in the inspector's visual tab.

There's a few problems with it, becuse GtkSnapshot optimized container
nodes away if they are not needed, so we are losing some widgets...

docs/reference/gtk/running.sgml
gtk/gtkdebug.h
gtk/gtkmain.c
gtk/gtkwidget.c
gtk/inspector/visual.c
gtk/inspector/visual.ui

index 3bc8f3571475a2671c418dcfcad2705a805b6430..e8708ceee134d34ec3124a061f3e3b6605719973 100644 (file)
@@ -210,6 +210,10 @@ additional environment variables.
       <term>layout</term>
       <listitem><para>Show layout borders</para></listitem>
     </varlistentry>
+    <varlistentry>
+      <term>snapshot</term>
+      <listitem><para>Include debug render nodes in the generated snapshots</para></listitem>
+    </varlistentry>
   </variablelist>
   The special value <literal>all</literal> can be used to turn on all
   debug options. The special value <literal>help</literal> can be used
index 3f624a91107deed09eba0d313681d0f46f3fd452..e550a32715b91d1fae845d6ee1a2fd9882574957 100644 (file)
@@ -53,7 +53,8 @@ typedef enum {
   GTK_DEBUG_TOUCHSCREEN     = 1 << 15,
   GTK_DEBUG_ACTIONS         = 1 << 16,
   GTK_DEBUG_RESIZE          = 1 << 17,
-  GTK_DEBUG_LAYOUT          = 1 << 18
+  GTK_DEBUG_LAYOUT          = 1 << 18,
+  GTK_DEBUG_SNAPSHOT        = 1 << 19
 } GtkDebugFlag;
 
 #ifdef G_ENABLE_DEBUG
index 21d1870894c89b108b3bf908a9b8ed9d251ce79b..ba7b3c6303b2909aec43be276404bfc018e88ae1 100644 (file)
@@ -171,7 +171,8 @@ static const GDebugKey gtk_debug_keys[] = {
   { "touchscreen", GTK_DEBUG_TOUCHSCREEN },
   { "actions", GTK_DEBUG_ACTIONS },
   { "resize", GTK_DEBUG_RESIZE },
-  { "layout", GTK_DEBUG_LAYOUT }
+  { "layout", GTK_DEBUG_LAYOUT },
+  { "snapshot", GTK_DEBUG_SNAPSHOT }
 };
 #endif /* G_ENABLE_DEBUG */
 
index 8c54364362a16ae268d1ca36bbcad2ec5d7c8d98..04dfc04d5eeb1aa53d1a6cff264e60d43497a741 100644 (file)
@@ -15560,6 +15560,9 @@ gtk_widget_snapshot (GtkWidget   *widget,
    */
   mode = get_render_mode (klass);
 
+  if (GTK_DEBUG_CHECK (SNAPSHOT))
+    gtk_snapshot_push (snapshot, TRUE, "%s<%p>", gtk_widget_get_name (widget), widget);
+
   if (mode == RENDER_DRAW)
     {
       cairo_t *cr;
@@ -15595,6 +15598,9 @@ gtk_widget_snapshot (GtkWidget   *widget,
       if (opacity < 1.0)
         gtk_snapshot_pop_and_append (snapshot);
     }
+
+  if (GTK_DEBUG_CHECK (SNAPSHOT))
+    gtk_snapshot_pop_and_append (snapshot);
 }
 
 void
index 400a75104bfcc5994758073eda48b4db0c3ce8d6..dadead345dfb1e4c929083fe004020f28965df71 100644 (file)
@@ -269,6 +269,21 @@ layout_activate (GtkSwitch *sw)
   redraw_everything ();
 }
 
+static void
+snapshot_activate (GtkSwitch *sw)
+{
+  guint flags;
+
+  flags = gtk_get_debug_flags ();
+
+  if (gtk_switch_get_active (sw))
+    flags |= GTK_DEBUG_SNAPSHOT;
+  else
+    flags &= ~GTK_DEBUG_SNAPSHOT;
+
+  gtk_set_debug_flags (flags);
+}
+
 static void
 widget_resize_activate (GtkSwitch *sw)
 {
@@ -919,6 +934,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, rendering_mode_changed);
   gtk_widget_class_bind_template_callback (widget_class, baselines_activate);
   gtk_widget_class_bind_template_callback (widget_class, layout_activate);
+  gtk_widget_class_bind_template_callback (widget_class, snapshot_activate);
   gtk_widget_class_bind_template_callback (widget_class, widget_resize_activate);
   gtk_widget_class_bind_template_callback (widget_class, software_gl_activate);
   gtk_widget_class_bind_template_callback (widget_class, software_surface_activate);
index 7e28451811a1fe8a3469c3bf869df06140a17907..ea8d0f891b07407179fc7371f108400671cd34fd 100644 (file)
                     </child>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkListBoxRow">
+                    <property name="visible">True</property>
+                    <property name="activatable">False</property>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="visible">True</property>
+                        <property name="orientation">horizontal</property>
+                        <property name="margin">10</property>
+                        <property name="spacing">40</property>
+                        <child>
+                          <object class="GtkLabel" id="snapshot_label">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Snapshot Debug Nodes</property>
+                            <property name="halign">start</property>
+                            <property name="valign">baseline</property>
+                            <property name="xalign">0.0</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSwitch" id="snapshot_switch">
+                            <property name="visible">True</property>
+                            <property name="halign">end</property>
+                            <property name="valign">baseline</property>
+                            <signal name="notify::active" handler="snapshot_activate"/>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
                 <child>
                   <object class="GtkListBoxRow">
                     <property name="visible">True</property>
       <widget name="updates_label"/>
       <widget name="baselines_label"/>
       <widget name="layout_label"/>
+      <widget name="snapshot_label"/>
       <widget name="touchscreen_label"/>
       <widget name="gl_label"/>
       <widget name="software_gl_label"/>